package ar.com.gals.repository;

import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.CriteriaSpecification;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;

import ar.com.gals.domain.Usuario;


public class UsuarioRepository extends AbstractRepository<Usuario> {

	
	public UsuarioRepository(Session session) {
		super(session, Usuario.class);
	}
	
	
	@SuppressWarnings("unchecked")
	public List<Usuario> getAllNegocios(String codigo, String razonSocial) {
		Criteria criteria = this.session.createCriteria(domain);
				
		if(codigo != null && !codigo.isEmpty())
			criteria.add(Restrictions.eq("codigo", codigo));
		
		if(razonSocial != null && !razonSocial.isEmpty())
			criteria.add(Restrictions.ilike("razonSocial", "%"+razonSocial+"%"));
		
		Criteria criteriaRol = criteria.createCriteria("rol");
		criteriaRol.add(Restrictions.eq("nombre", "NEGOC"));
		
		criteria.add(Restrictions.isNull("fechaDelete"));
		criteria.addOrder(Order.asc("codigo"));
		criteria.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY);
		
		List<Usuario> list = (List<Usuario>) criteria.list();
		return list;
	}

	@SuppressWarnings("unchecked")
	public List<Usuario> getAllEmpleados(Usuario empleador, String nombre, String apellido) {
		Criteria criteria = this.session.createCriteria(domain);
		
		if(nombre != null && !nombre.isEmpty())
			criteria.add(Restrictions.ilike("nombre", "%"+nombre+"%"));
		
		if(apellido != null && !apellido.isEmpty())
			criteria.add(Restrictions.ilike("apellido", "%"+apellido+"%"));
		
		Criteria criteriaRol = criteria.createCriteria("rol");
		criteriaRol.add(Restrictions.eq("nombre", "EMPLE"));
		
		Criteria criteriaEmpleador = criteria.createCriteria("empleador");
		criteriaEmpleador.add(Restrictions.idEq(empleador.getId()));
		
		criteria.add(Restrictions.isNull("fechaDelete"));
		criteria.addOrder(Order.asc("apellido"));
		criteria.addOrder(Order.asc("nombre"));
		criteria.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY);
		
		List<Usuario> list = (List<Usuario>) criteria.list();
		return list;
	}
	
	
	@SuppressWarnings("unchecked")
	public Usuario getByCodigo(String codigo) {
		Criteria criteria = this.session.createCriteria(domain)
				.add(Restrictions.ilike("codigo", codigo))
				.add(Restrictions.isNull("fechaDelete"))
				.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY);
		
		Criteria criteriaRol = criteria.createCriteria("rol");
		criteriaRol.add(Restrictions.eq("nombre", "NEGOC"));
		
		List<Usuario> list = (List<Usuario>) criteria.list();
		if(list.isEmpty()) return null;
		return (Usuario) list.get(0);
	}

	
	@SuppressWarnings("unchecked")
	public Usuario getByName(String nombre) {
		Criteria criteria = this.session.createCriteria(domain)
				.add(Restrictions.ilike("nombreUsuario", nombre))
				.add(Restrictions.isNull("fechaDelete"))
				.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY);
		List<Usuario> list = (List<Usuario>) criteria.list();
		if(list.isEmpty()) return null;
		return (Usuario) list.get(0);
	}
}
